package rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * J<i>ava</i> U<i>tilities</i> for S<i>tudents</i>
 */
/**
 * Représente un client effectuant une requête lui permettant d'obtenir les
 * numéro de téléphones des hôtels répondant à son critère de choix.
 *
 * @author Morat
 */
public class LookForHotel {

    /**
     * le critère de localisaton choisi
     */
    private String localisation;
    private String nomChaine = "Hotels";
    private ChaineInterface chaine;
    private AnnuaireInterface annuaire;
    private List<Hotel> hotels = new ArrayList();
    private List<Numero> numeros = new ArrayList();

    // ...
    /**
     * Définition de l'objet représentant l'interrogation.
     *
     * @param args les arguments n'en comportant qu'un seul qui indique le
     * critère de localisation
     */
    public LookForHotel(String... args) {
        localisation = args[0];
    }

    /**
     * réalise une intérrogation
     *
     * @return la durée de l'interrogation
     * @throws RemoteException
     */
    public long call() {
        long time =System.currentTimeMillis();
        try { 
            //On recupere l'annuaire
            annuaire = (AnnuaireInterface) Naming.lookup("Annuaire");
            
            System.out.println("Recherche numéros des hotels à : " + localisation);
            
            //Pour les 4 chaines differentes, on cherche les hotels qui sont à 'localisation'
            for (int i = 1; i <= 4; i++) {

                System.out.println("Recherche pour la chaine : " + nomChaine + i);
                //Recupere chaine i
                chaine = (ChaineInterface) Naming.lookup(nomChaine + i);
                //Recupere les hotels de la chaine i à loc
                hotels = chaine.getListHotel(localisation);

                //Pour chacun des hotels on ajoute leur numero à la liste des numero
                for (Hotel h : hotels) {
                    numeros.add(annuaire.getNumero(h.name));
                }
            }

//            On afficher les numeros trouvé
            for (Numero num : numeros) {
                System.out.println("Numéro " + num);
            }


        } catch (NotBoundException | MalformedURLException | RemoteException ex) {
            Logger.getLogger(LookForHotel.class.getName()).log(Level.SEVERE, null, ex);
        }

        return (System.currentTimeMillis()-time);
    }

}
